import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JTextPane;
import javax.swing.JToggleButton;
import javax.swing.JToolBar;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;

public class Postit extends JFrame implements ActionListener{
  private SimpleAttributeSet aussehen;
  private JToggleButton bold, italic;
  private JTextPane textbereich;

  public Postit(){//Ein Postit ist ein JFrame mit Toolbar und Textbereich.
    super("PostIt");
    aussehen=new SimpleAttributeSet();
    JToolBar toolbar=new JToolBar(); // Toolbar im Norden
    add(toolbar, BorderLayout.NORTH);//   hier nur zwei Buttons: Fett und Kursiv
    bold  =new JToggleButton("Fett");
    italic=new JToggleButton("Kursiv");
    bold.addActionListener(this);    // wir reagieren selber auf die Buttons
    italic.addActionListener(this);
    toolbar.add(bold);               // Buttons in die Toolbar
    toolbar.add(italic);
    textbereich=new JTextPane();     // Im Center der Texteditor
    textbereich.setPreferredSize(new Dimension(400, 250));
    add(textbereich, BorderLayout.CENTER);
    pack(); //Größe anpassen, beendbar machen, anzeigen
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setVisible(true);
  }

  @Override
  public void actionPerformed(ActionEvent e) {
    StyleConstants.setBold(aussehen, bold.getModel().isSelected());
    StyleConstants.setItalic(aussehen, italic.getModel().isSelected());
    textbereich.setCharacterAttributes(aussehen, true); // SELTSAM, siehe unten
  }

  public static void main(String[] args) {
    new Postit();
  }
}
/* Die Zeile, mit textbereich.setCharacterAttributes ist sehr seltsam, weil es
   nur eine Instanz 'aussehen' gibt, die auch nur eine Kombination der Attribute
   Fett und Kursiv speichern kann. Aber anscheinend merkt sich die jeweils
   aktuelle Cursormarkierung von textbereich eine Kopie des übergebenen 'aussehen',
   sodass dessen spätere Veränderung (in actionPerformed) keine Auswirkungen mehr
   haben kann. (Das true hat damit aber nichts zu tun, siehe APIdoc.)
*/